Lumen 如何使用 Artisan Console

Lumen 是自带 Artisan Console的,但是文档中并没有进行说明。
可能作者默认 Lumen 的用户都是从 Laravel 过来的吧。

创建命令文件

Lumen 中没有加入 make:command 功能,所以只能手工创建文件。
这里使用 Laravel Artisan 官网文档案例,修改了一些代码,使其更简单易懂。

目录: App\Console\Commands

<?php

namespace App\Console\Commands;

use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command{
    /**
     * 控制台命令名称
     *
     * @var string
     */
    protected $signature = 'email:send';

    /**
     * 控制台命令描述
     *
     * @var string
     */
    protected $description = 'Send drip e-mails to a user';

    /**
     * The drip e-mail service.
     *
     * @var DripEmailer
     */
    protected $drip;

    /**
     * 执行控制台命令
     *
     * @return mixed
     */
    public function handle()
    {
        echo 'hello world'
    }
}

注册命令

Lumen 和 Lavarel 最主要的区别就在于需要手工创建 ServerProvider。

目录: App\Providers

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Console\Commands\SendEmails;

class SendEmailsServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //这里填写命令 与console文件中的命令相匹配
        $this->app->singleton('command.email.send', function () {
            return new SendEmails; //注意这里
        });

        //这里填写命令 与console文件中的命令相匹配
        $this->commands('command.email.send');
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        //这里填写命令 与console文件中的命令相匹配
        return ['command.email.send'];
    }
}

注册服务提供者

在 bootstrap/app.php 中注册服务提供者:

$app->register(App\Providers\ SendEmailsServiceProvider::class);

现在只要在 Lumen 项目的根目录下执行 php artisan 就可以看到 email:send 命令了
执行命令: php artisan email:send
执行结果: hello world

参考自: http://targetliu.com/2016/7/22/lumen-artisan-console.html